home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #2 / Amiga Plus CD - 1995 - No. 2.iso / startrek / trek73 / src / main.c < prev    next >
C/C++ Source or Header  |  1995-04-11  |  7KB  |  338 lines

  1. /*
  2.  * TREK73: main.c
  3.  *
  4.  * Originally written (in HP-2000 BASIC) by
  5.  *    William K. Char, Perry Lee, and Dan Gee
  6.  *
  7.  * Rewritten in C by
  8.  *    Dave Pare (sdcsvax!sdamos!mr-frog)
  9.  *        and
  10.  *    Christopher Williams (ucbvax!ucbmerlin!williams)
  11.  *
  12.  * Corrected, Completed, and Enhanced by
  13.  *    Jeff Okamoto    (ucbvax!okamoto)
  14.  *    Peter Yee    (ucbvax!yee)
  15.  *    Matt Dillon    (ucbvax!dillon)
  16.  *    Dave Sharnoff    (ucbvax!ucbcory!muir)
  17.  *        and
  18.  *    Joel Duisman    (ucbvax!duisman)
  19.  *
  20.  * Main Loop
  21.  *
  22.  * main, alarmtrap
  23.  *
  24.  */
  25.  
  26. #include <math.h>
  27. #ifdef unix
  28. #include <signal.h>
  29. #endif
  30. #include <setjmp.h>
  31. #include <stdio.h>
  32. #include "defines.h"
  33. #include "structs.h"
  34.  
  35. int    timeout;
  36. jmp_buf    jumpbuf;
  37. extern    char shutup[];
  38.  
  39.  
  40. main()
  41. {
  42.     extern    char **environ;
  43.     extern    struct list *newitem();
  44.     extern    char captain[];
  45.     extern    char title[];
  46.     extern    char foename[];
  47.     extern    char *foeraces[];
  48.     extern    char *foecaps[];
  49.     extern    char *foeshiptype[];
  50.     extern    char foerace[];
  51.     extern    char foestype[];
  52.     extern    int terse;
  53.     extern    int silly;
  54.     extern    char *feds[];
  55.     extern    char *baddies[MAXFOERACES][MAXBADS];
  56.     extern    struct cmd cmds[];
  57.     extern    struct ship *shiplist[];
  58.     extern    int shipnum;
  59.     extern     char shipname[];
  60.     extern  char slots[];
  61.     struct    cmd *scancmd();
  62.     int    alarmtrap();
  63.     register int i;
  64.     register int j;
  65.     register struct ship *sp;
  66.     register struct list *lp;
  67.     char    buf1[30];
  68.     struct    cmd *cp;
  69.     int    range;
  70.     float    bearing;
  71.     int    loop;
  72.     int    len;
  73.     int    enemynum;
  74.     extern    char slots[];
  75.     char    *tmp;
  76.     int    swap1;
  77.     int    swap2;
  78.     int    offset;
  79.     extern    int (*strategies[])();
  80.     extern    char *options;
  81.     extern    char *getenv();
  82.     extern    char sex[];
  83.     extern    char shipbuf[];
  84.     extern    char science[];
  85.     extern     char engineer[];
  86.     extern    char com[];
  87.     extern    char nav[];
  88.     extern    char helmsman[];
  89.     extern    char racename[];
  90.     extern    int init_p_turn[];
  91.     extern    int init_t_turn[];
  92.     extern    char *foeempire[];
  93.     extern    char empire[];
  94.  
  95. #ifdef unix
  96.     signal(SIGALRM, alarmtrap);
  97.     signal(SIGINT, SIG_IGN);
  98.     SRANDOM(time(0));
  99.     options = getenv("TREK73OPTS");
  100.     if (options != NULL) {
  101.         parse_opts(options);
  102.     }
  103. #else
  104.     SRANDOM(12345);
  105. #endif
  106.     if (strlen(science) == 0)
  107.         strcpy(science, "Spock");
  108.     if (strlen(engineer) == 0)
  109.         strcpy(engineer, "Scott");
  110.     if (strlen(com) == 0)
  111.         strcpy(com, "Uhura");
  112.     if (strlen(nav) == 0)
  113.         strcpy(nav, "Chekov");
  114.     if (strlen(helmsman) == 0)
  115.         strcpy(helmsman, "Sulu");
  116.     if (strlen(captain) == 0) {
  117.         printf("\n\nCaptain: my last name is ");
  118.         if (gets(buf1) == NULL || *buf1 == NULL)
  119.             exit(1);
  120.         strcpy (captain, buf1);
  121.     }
  122.     if (*captain == '*') {
  123.         terse = 1;
  124.         len = strlen(captain) + 1;
  125.         for (loop = 1; loop < len; loop++)
  126.             captain[loop-1] = captain[loop];
  127.     }
  128.     if (strlen(sex) != 0)
  129.         strcpy(buf1,sex);
  130.     else {
  131.         printf("%s: My sex is: ",captain);
  132.         if (gets(buf1) == NULL || *buf1 == NULL)
  133.             exit(1);
  134.     }
  135.     if ((*buf1 <= 'z') && (*buf1 >= 'a'))
  136.         *buf1 = *buf1 - 'a' + 'A';
  137.     switch(*buf1) {
  138.     case 'M':
  139.         strcpy(title, "Sir");
  140.         break;
  141.     case 'F':
  142.         strcpy(title, "Ma'am");
  143.         break;
  144.     default :
  145.         switch (RANDOM() % 6) {
  146.         case 0:
  147.             strcpy(title, "Fag");
  148.             break;
  149.         case 1:
  150.             strcpy(title, "Fairy");
  151.             break;
  152.         case 2:
  153.             strcpy(title, "Fruit");
  154.             break;
  155.         case 3:
  156.             strcpy(title, "Weirdo");
  157.             break;
  158.         case 4:
  159.             strcpy(title, "Gumby");
  160.             break;
  161.         case 5:
  162.             strcpy(title, "Freak");
  163.             break;
  164.         }
  165.     }
  166.     if (strlen(shipbuf) != 0) {
  167.         strcpy(buf1,shipbuf);
  168.     } else {
  169.         getships:
  170.         printf("   I'm expecting [1-9] enemy vessels ");
  171.         if (gets(buf1) == NULL || *buf1 == NULL)
  172.             exit(1);
  173.     }
  174.     i = atoi(buf1);
  175.     if (i < 1 || i > 9) {
  176.         printf("%s:   %s, Starfleet Command reports that it can only\n", com, title);
  177.         printf("   be from 1 to 9.  Try again.\n");
  178.         printf("%s:  Correct, Lieutenant -- just testing your attention..\n", captain);
  179.         goto getships;
  180.     }
  181.     shipnum = i;
  182.     for (loop = 0; loop < shipnum; loop++);
  183.         slots[loop] = 'X';
  184.     if (strlen(racename) == 0) {
  185.         if (silly == 0)
  186.             offset = 1;
  187.         else
  188.             offset = 0;
  189.         enemynum = randm(MAXFOERACES - offset) - 1;
  190.     } else {
  191.         for (loop=0; loop<MAXFOERACES; loop++)
  192.             if (strncmp(racename, foeraces[loop], strlen(racename)) == 0) {
  193.                 enemynum = loop;
  194.                 break;
  195.             }
  196.         if (loop == MAXFOERACES) {
  197.             printf("Cannot find race %s.\n", racename);
  198.             enemynum = randm(MAXFOERACES) - 1;
  199.         }
  200.     }
  201.     strcpy(foerace, foeraces[enemynum]);
  202.     strcpy(foestype, foeshiptype[enemynum]);
  203.     strcpy(empire, foeempire[enemynum]);
  204.     if (strlen(foename) == 0)
  205.         strcpy(foename, foecaps[randm(MAXENCOMM) - 1]);
  206.     /*
  207.      * Randomize the enemy ships 
  208.      */
  209.     for (loop = 0; loop < 20; loop++) {
  210.         swap1 = randm(MAXBADS) - 1;
  211.         swap2 = randm(MAXBADS) - 1;
  212.         tmp = baddies[enemynum][swap1];
  213.         baddies[enemynum][swap1] = baddies[enemynum][swap2];
  214.         baddies[enemynum][swap2] = tmp;
  215.     }
  216.     /*
  217.      * everybody is centered on the federation ship
  218.      * (for now, anyways)
  219.      */
  220.     for (i=0; i<=shipnum; i++) {
  221.         lp = newitem(I_SHIP);
  222.         lp->data.sp = MKNODE(struct ship, *, 1);
  223.         sp = shiplist[i] = lp->data.sp;
  224.         if (i)
  225.             strcpy(sp->name, baddies[enemynum][i-1]);
  226.         sp->warp = sp->newwarp = 1.0;
  227.         sp->course = sp->newcourse = randm(360);
  228.         sp->eff = .75;
  229.         sp->regen = 10.0;
  230.         sp->energy = 150;
  231.         sp->pods = 200;
  232.         sp->id = i;
  233.         for (j=0; j<4; j++) {
  234.             sp->phasers[j].target = NULL;
  235.             sp->phasers[j].bearing = init_p_turn[j];
  236.             sp->phasers[j].load = 10;
  237.             sp->phasers[j].drain = 10;
  238.             sp->phasers[j].status = P_NORMAL;
  239.         }
  240.         for (j=0; j<4; j++) {
  241.             sp->shields[j].eff = 1.0;
  242.             sp->shields[j].drain = 0.0;
  243.             sp->shields[j].attemp_drain = 1.0;
  244.         }
  245.         sp->p_spread = 10;
  246.         for (j=0; j<6; j++) {
  247.             sp->tubes[j].target = NULL;
  248.             sp->tubes[j].bearing = init_t_turn[j];
  249.             sp->tubes[j].load = 0;
  250.             sp->tubes[j].status = T_NORMAL;
  251.         }
  252.         sp->t_lspeed = 12;
  253.         sp->t_prox = 200;
  254.         sp->t_delay = 10;
  255.         sp->p_percent = 100;
  256.         sp->status = S_NORMAL;        /* all is well */
  257.         sp->target = NULL;
  258.         sp->eluding = 0;
  259.         sp->delay = 10000;
  260.         range = 4100 + randm(300) - i * 200;
  261.         bearing = toradians(randm(360));
  262.         sp->x = range * cos(bearing);
  263.         sp->y = range * sin(bearing);
  264.         sp->crew = 350;
  265.         sp->strategy = strategies[0];
  266.     }
  267.     /*
  268.      * federation exceptions
  269.      */
  270.     sp = shiplist[0];
  271.     sp->course = sp->newcourse = 0;
  272.     sp->eff = 1.0;
  273.     sp->x = sp->y = 0;
  274.     sp->crew = 450;
  275.     if (strlen(shipname) == 0) {
  276.         i = randm(MAXFEDS) - 1;
  277.         strcpy(sp->name, feds[i]);
  278.     } else {
  279.         strcpy(sp->name, shipname);
  280.     }
  281.     for(loop=shipnum+1; loop<300; loop++)
  282.         slots[loop] = ' ';
  283.     mission();
  284.     warning();
  285.     setjmp(jumpbuf);
  286.     timeout = 0;
  287. #ifdef unix
  288.     signal(SIGALRM, alarmtrap);
  289.     alarm(0);
  290. #endif
  291.     for (;;) {
  292.         sp = shiplist[0];
  293.         if (!(sp->status & S_DEAD)) {
  294. #ifdef unix
  295.             alarm(20);
  296. #endif
  297.             for (loop = 0; loop < HIGHSHUTUP; loop++)
  298.                 shutup[loop] = 0;
  299.             printf("\n%s: Code [1-30] ", captain);
  300.             if (gets(buf1) != NULL) {
  301.                 cp = scancmd(buf1);
  302.                 if (cp != NULL) {
  303.                     (*cp->routine)(sp);
  304.                     if (!cp->turns)
  305.                         continue;
  306.                 } else
  307.                     printf("\n%s: What??\n", science);
  308.             }
  309.         }
  310. #ifdef unix
  311.         alarm(0);
  312.         alarmtrap(0);
  313. #endif
  314.     }
  315. }
  316.  
  317. #ifdef unix
  318. alarmtrap(sig)
  319. int sig;
  320. {
  321.     extern    int timeout;
  322.     extern    jmp_buf jumpbuf;
  323.  
  324.     if (sig) {
  325.         printf("\n** TIME **\n");
  326.         stdin->_cnt = 0;
  327.     }
  328.     if (!(shiplist[0]->status & S_DEAD))
  329.         printf("\n");
  330.     shiplist[1]->strategy();
  331.     move_ships();
  332.     if (sig) {
  333.         timeout = 1;
  334.         longjmp(jumpbuf, 1);
  335.     }
  336. }
  337. #endif
  338.